MicroPython-Firmware schmirgeln (240er)

Vermutlich hat sie sich wieder aufgehängt.

Es ging jetzt, hast du das logging abgespeckt? Früher war mehr output, das hat mich verwirrt, es kamen nur Fehlermeldungen, dass Verzeichnisse nicht angelegt werden konnten.

Das sind nur Meldungen von der Dateiübertragung auf das Gerät, vermute ich. Das ist nicht die Logausgabe auf dem Terminal des Geräts.

Es gibt ein paar neue Optionen, um das Logging abzuschalten. Wenn Du diese nicht bemüht hast, sollte eigentlich alles gut funktionieren. Vielleicht hast Du aber genau in diesem Bereich einen weiteren Fehler entdeckt.

Ich habe

    # Enable or disable logging completely.
    'enabled': True,

    # Log configuration settings at system startup.
    'configuration': True,

Früher kam doch epoch time und nochmal epoch time das kommt jetzt nicht mehr.

make install liefert nun das als log
root@XPS13-CGruber:/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware# make install
Device port: usb => /dev/ttyS16
.venv3/bin/rshell --port /dev/ttyS16 --user micro --password python --buffer-size 2048 --quiet mkdir /flash/dist-packages
.venv3/bin/rshell --port /dev/ttyS16 --user micro --password python --buffer-size 2048 --quiet rsync dist-packages /flash/dist-packages
.venv3/bin/rshell --port /dev/ttyS16 --user micro --password python --buffer-size 2048 --quiet --file tools/upload-framework.rshell
.venv3/bin/rshell --port /dev/ttyS16 --user micro --password python --buffer-size 2048 --quiet --file tools/upload-sketch.rshell
root@XPS13-CGruber:/home/cgruber/hiveeyes/sources/hiveeyes-

und make recycle das:

micropython-firmware# make recycle
Device port: usb => /dev/ttyS16
.venv3/bin/rshell --port /dev/ttyS16 --user micro --password python --buffer-size 2048 --quiet --file tools/upload-framework.rshell
Unable to create /flash/lib/terkin
Unable to create /flash/lib/hiveeyes
.venv3/bin/rshell --port /dev/ttyS16 --user micro --password python --buffer-size 2048 --quiet --file tools/upload-sketch.rshell
Entering REPL. Use Control-X to exit.
>
Pycom MicroPython 1.20.0.rc12 [v1.9.4-81167ed] on 2019-07-15; LoPy with ESP32
Type "help()" for more information.
>>>
>>> import machine ; machine.reset()
ets Jun  8 2016 00:22:57

rst:0x7 (TG0WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff8028,len:8
load:0x3fff8030,len:2156
ho 0 tail 12 room 4
load:0x4009fa00,len:19208
entry 0x400a05f4
Initializing filesystem as LittleFS!
Traceback (most recent call last):
  File "main.py", line 31, in <module>
  File "/flash/lib/hiveeyes/datalogger.py", line 14, in <module>
  File "/flash/lib/terkin/datalogger.py", line 11, in <module>
  File "/flash/lib/terkin/configuration.py", line 9, in <module>
  File "dist-packages/dotty_dict/__init__.py", line 2, in <module>
  File "dist-packages/dotty_dict/dotty_dict.py", line 3, in <module>
  File "dist-packages/collections/__init__.py", line 6, in <module>
ImportError: cannot import name OrderedDict
Pycom MicroPython 1.20.0.rc12 [v1.9.4-81167ed] on 2019-07-15; LoPy with ESP32
Type "help()" for more information.
>>>

Lässt cannot import name OrderedDict auf einen Fehler in meiner settings.py schließen?

rshell verboseness

Ja, an dieser Stelle ist die Ausgabe nun etwas weniger verbose als früher. Ändern kannst Du es, indem Du in der Datei tools/micropython.mk hinten den Parameter --quiet entfernst, sowie ggf. auch wieder --timing hinzufügst.

$(eval rshell_options  := --port $(mcu_port) --user micro --password python --buffer-size $(mcu_transfer_buffer) --quiet)

Broken dependencies

Problem

Das weist darauf hin, dass irgendetwas bei den Abhängigkeiten kaputtgegangen ist.

Analyse

Während die Datei collections/__init__.py auf meiner Workstation noch völlig in Ordnung ist, hat jener commit, der gerade gestern reinkam, unsere Geschichte wohl kurzzeitig in Mitleidenschaft gezogen.

Bummer. Will fix this.

Das sollte nun wieder heile sein.

Please invoke these commands to heal your local sandbox.

git pull
make setup
make recycle-ng

Die Ursache war, dass der Autor Änderungen an der Bibliothek pycopy-collections vorgenommen hatte, die für das Pycom-Ökosystem inkompatibel waren und wir derzeit aufgrund von Mängeln im upip package installer nicht die genaue Version eines abhängigen Pakets in der Beschreibungsdatei requirements-mpy.txt entsprechend “pinnen” können.


P.S.: Ping @weef re. Python package pinning bei Erschließung von Annotationen im Grafana per "grafannotate" - #13 by weef.

1 Like

Jetzt kommt ein AttributeError: 'dict' object has no attribute 'name' könnten das die Änderungen in der settings.py von gestern sein? Dann muss ich die noch nachziehen?!

   22.4087 [terkin.sensor.core       ] INFO   : Starting all busses [{'pin_scl': 'P10', 'number': 0, 'enabled': True, 'family': 'i2c', 'pin_sda': 'P9'}, {'pin_scl': 'P21', 'number': 1, 'enabled': False, 'family': 'i2c', 'pin_sda': 'P22'}, {'enabled': True, 'pin_data': 'P11', 'number': 0, 'family': 'onewire'}]
   22.4786 [terkin.sensor.core       ] INFO   : Found 0 I2C devices: [].
   22.4982 [terkin.sensor.core       ] INFO   : Registering bus "i2c:0"
Traceback (most recent call last):
  File "main.py", line 67, in <module>
  File "main.py", line 62, in main
  File "/flash/lib/terkin/datalogger.py", line 151, in start
  File "/flash/lib/terkin/sensor/core.py", line 50, in register_busses
AttributeError: 'dict' object has no attribute 'name'
Pycom MicroPython 1.20.0.rc12 [v1.9.4-81167ed] on 2019-07-15; LoPy with ESP32
Type "help()" for more information.
>>>

Das ist sehr wahrscheinlich. Oder wir haben irgendetwas nicht ordentlich berücksichtigt. Konntest Du hier schon weiterkommen?

Bei mir läuft es mit der aktuellen Version von Github problemlos, ist bei dir @clemens sicher nur die stettings.py neu anzupassen.

1 Like

Bei mir läuft es immer noch nicht! Mit der mitgelieferten settings.example-bob.py läuft es, mit der mitgelieferten settings.example.py läuft es nicht, da kommt

Traceback (most recent call last):
  File "main.py", line 67, in <module>
  File "main.py", line 62, in main
  File "/flash/lib/terkin/datalogger.py", line 151, in start
  File "/flash/lib/terkin/sensor/core.py", line 50, in register_busses
AttributeError: 'dict' object has no attribute 'name'

Mit meiner settings.py läuft es auch nicht

"""Datalogger configuration"""

# General settings.
main = {

    # Measurement intervals in seconds.
    # Todo: Please note this is not the _real thing_ yet at it will just use
    #       this value to apply to ``time.sleep()`` after each duty cycle.
    'interval': {
        'field': 60.0,
        'maintenance': 15.0,
    },

    # Whether to use deep sleep between measurement cycles.
    'deepsleep': False,

    # Configure logging.
    'logging': {

        # Enable or disable logging completely.
        'enabled': True,

        # Log configuration settings at system startup.
        'configuration': True,
    },

    # Configure Watchdog.
    'watchdog': {

        # Enable or disable Watchdog completely.
        'enabled': False,

        # Watchdog timeout in milliseconds.
        'timeout': 20000,
    },

    # Configure backup.
    'backup': {
        # How many backup files to keep around.
        'file_count': 7,
    },

    # Whether to skip LTE modem deinit on startup. This will save ~6 seconds.
    'fastboot': False,

    # Configure RGB-LED.
    'rgb_led': {
        'heartbeat': False,
    },

}

# Control the services offered by the device.
services = {
    'api': {
        'modeserver': {
            'enabled': True,
        },
        'http': {
            'enabled': True,
        },
    },
}

# Interface settings.
interfaces = {
    'uart0': {
        'terminal': True,
    }
}

# Networking configuration.
networking = {
    'wifi': {
        # WiFi stations to connect to in STA mode.
        'stations': [

            # Variant 1: Use DHCP.

            # Variant 1a: Straight forward.
            {'ssid': 'xx', 'password': 'xx'},

            # Variant 1b: Configure timeout (default: 15 seconds).
            # Configure this to decrease or increase the maximum time in
            # seconds to wait for the connection to succeed.
            #{'ssid': 'FooBar', 'password': 'SECRET', 'timeout': 5.0},

            # Variant 2: Using static IP address.
            #{
            #    'ssid': 'FooBar',
            #    'password': 'SECRET',
            #    # Use static network configuration (ip, subnet_mask, gateway, DNS_server).
            #    'ifconfig': ('192.168.42.42', '255.255.255.0', '192.168.42.1', '192.168.42.1'),
            #},
        ],
    },
    'lora': {
        'otaa': {
            'frequency': 868100000,
            'region': 'LoRa.EU868',
            'datarate': 0,
            'device_eui': '<GENERATED_FROM_LORA_MAC>',
            'application_eui': '<REGISTRATION NEEDED>',
            'application_key': '<REGISTRATION NEEDED>',
        },
        'antenna_attached': False,
    }
}

# Telemetry configuration.
telemetry = {
    'targets': [

        # Hiveeyes telemetry: JSON over MQTT
        {
            # Enable/disable this telemetry target.
            'enabled': True,

            # Define telemetry endpoint and address information.
            'endpoint': 'mqtt://swarm.hiveeyes.org',

            'topology': 'mqttkit',
            'address': {
                "realm": "hiveeyes",
                "network": "xx",
                "gateway": "xx",
                "node": "xx",
            },
        },

        # JSON over HTTP: Kotori/MQTTKit
        {
            # Enable/disable this telemetry target.
            'enabled': False,

            # Define telemetry endpoint and address information.
            'endpoint': 'https://daq.example.org/api',
            'topology': 'mqttkit',
            'address': {
                "realm": "workbench",
                "network": "testdrive",
                "gateway": "area-42",
                "node": "node-01-http-json",
            },

            # Use alternative, non-HTTPS endpoint.
            # 'endpoint': 'http://daq.example.org/api-notls',

        },

        # Beep telemetry: JSON over HTTP
        {
            # Enable/disable this telemetry target.
            'enabled': False,

            # Define telemetry endpoint and address information.
            'endpoint': 'https://bee-observer.org/api/sensors',
            'topology': 'beep-bob',
            'data': {
                'key': '',
            },
        },

        # CayenneLPP over MQTT, Base64 encoded
        {
            # Enable/disable this telemetry target.
            'enabled': False,

            # Define telemetry endpoint and address information.
            'endpoint': 'mqtt://daq.example.org',
            'address': {
                "realm": "workbench",
                "network": "testdrive",
                "gateway": "area-42",
                "node": "node-01-mqtt-lpp",
            },
            'format': 'lpp',
            'encode': 'base64',
        }
    ],
}

# Sensor configuration.
sensors = {

    # Whether to prettify sensor log output.
    'prettify_log': True,

    'system': {

        # Adjust voltage divider resistor values matching the board.
        #
        # See also
        # - https://forum.pycom.io/topic/3776/adc-use-to-measure-battery-level-vin-level
        # - https://github.com/hiveeyes/hiveeyes-micropython-firmware/issues/5
        # - https://community.hiveeyes.org/t/batterieuberwachung-voltage-divider-und-attenuation-fur-microypthon-firmware/2128
        #
        # As a reference (all readings using 6dB attenuation unless otherwise noted):
        #
        # - Pycom Expansion board v3.0: 115 kΩ / 56 kΩ
        # - Pycom Expansion board v3.1: 1 MΩ / 1 MΩ
        # - Pycom Expansion board v3.2: 1 MΩ / 1 MΩ
        # - BOB-HAT-V5: 1 MΩ / 470 kΩ or 220 kΩ
        # - BOB-SHIELD: 10 MΩ / 2 MΩ
        # - Air Quality monitor: 100kΩ / 47 kΩ, measured with 2.5dB attenuation

        # These settings are matching the resistor values of the Pycom Expansion Board 3.1 and 3.2.
        'vcc': {

            'pin': 'P16',

            # Main resistor value (R1).
            'resistor_r1': 10,

            # Resistor between input pin and ground (R2).
            'resistor_r2': 2,
        },

        # Settings for button events, e.g. through touch pads.
        'buttons': {
            'enabled': False,
        },
    },
    'environment': [
        {
            'id': 'scale-1',
            'number': 0,
            'name': 'scale',
            'description': 'Waage 1',
            'type': 'HX711',
            'enabled': False,
            'pin_dout': 'P22',
            'pin_pdsck': 'P21',
            'scale': -22404.0, 
            'offset': 31722.0,
        },
        {
            'id': 'ds18b20-1',
            'name': 'temperature',
            'description': 'Temperatur Brutnest',
            'type': 'DS18B20',
            'enabled': True,
            'bus': 'onewire:0',
            'devices': [
                {
                    'id': 'ds18b20-br1-wg1',
                    'address': '28ff641d8fdae234',
                    'description': 'BR 1, Wabengasse 1',
                    'enabled': True,
                    #'offset': 0.42,
                },
                {
                    'id': 'ds18b20-br1-wg2',
                    'address': '28ff641d8fa67062',
                    'description': 'BR 1, Wabengasse 2',
                    'enabled': True,
                    #'offset': 0.42,
                },
                {
                    'id': 'ds18b20-br1-wg3',
                    'address': '28ff641d8fc17e49',
                    'description': 'BR 1, Wabengasse 3',
                    'enabled': True,
                    #'offset': 0.42,
                },
                {
                    'id': 'ds18b20-br1-wg4',
                    'address': '28ff641d8fa5514a',
                    'description': 'BR 1, Wabengasse 4',
                    'enabled': True,
                    #'offset': 0.42,
                },
                {
                    'id': 'ds18b20-br1-wg5',
                    'address': '28ff0c07c0170160',
                    'description': 'BR 1, Wabengasse 5',
                    'enabled': True,
                    #'offset': 0.42,
                },
            ]
        },
        {
            'id': 'bme280-1',
            'description': 'Temperatur und Feuchte außen',
            'type': 'BME280',
            'enabled': False,
            'bus': 'i2c:0',
            'address': 0x77,
        },
    ],
    'busses': [
        {
            "id": "bus-i2c-0",
            "family": "i2c",
            "number": 0,
            "enabled": False,
            "pin_sda": "P9",
            "pin_scl": "P10",
        },
        {
            "id": "bus-i2c-1",
            "family": "i2c",
            "number": 1,
            "enabled": False,
            "pin_sda": "P22",
            "pin_scl": "P21",
        },
        {
            "id": "bus-onewire-0",
            "family": "onewire",
            "number": 0,
            "enabled": True,
            "pin_data": "P11",
        },
    ]
}

Vielen Dank fürs Testen!

Der commit

sollte das Problem beheben. Die Ursache lag bei der inkorrekten Behandlung von Bus-Konfigurationsobjekten, die per "enabled": False deaktiviert wurden.

Jetzt ist hier wieder alles in Ordnung und die Software tut wieder was sie soll:

Bus with id "bus-i2c-0" and family "i2c" is disabled, skipping registration
1 Like

Falls das unter WSL am Ende so ausschauen soll:

root@XPS13-CGruber:/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware# python -m mpy_cross
no input file

funktioniert es bei mir in Ubuntu als WSL mit Win10.

1 Like

Exzellent. Dann sollte auch make recycle-ng MPY_CROSS=true gut klappen. Damit werden durch die Bank (bis auf main.py, boot.py, settings.py) alle Dateien zu .mpy kompiliert und in Folge diese erst übertragen. Die Musik spielt im Ordner lib-mpy.

make recycle-ng funktionierte ja nicht wegen der kleineren lftp-Version, Andreas hat jetzt nachgebessert und ruft die nativ unter Win10 installierte lftp-version auf (bitte berichtigen, wenn ich hier Quatsch schreibe!), leider passt was noch nicht:

root@XPS13-CGruber:/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware# make recycle-ng
Device port: usb => /dev/ttyS16
make[1]: Entering directory '/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware'
INFO: Uploading MicroPython code to device
  File "tools/terkin.py", line 52
    log.info(f'Hostname "{hostname}" found at IP address "{ip_address}"')
                                                                       ^
SyntaxError: invalid syntax
tools/core.mk:88: recipe for target 'notify' failed
make[1]: *** [notify] Error 1
make[1]: Leaving directory '/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware'
Makefile:164: recipe for target 'install-ng' failed
make: *** [install-ng] Error 2
root@XPS13-CGruber:/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware#

per IP hauts aber auch nicht hin:

root@XPS13-CGruber:/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware#  export MCU_PORT=192.168.178.24
root@XPS13-CGruber:/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware# make recycle-ng
Device port: ip => 192.168.178.24
make[1]: Entering directory '/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware'
INFO: Uploading MicroPython code to device
  File "tools/terkin.py", line 52
    log.info(f'Hostname "{hostname}" found at IP address "{ip_address}"')
                                                                       ^
SyntaxError: invalid syntax
tools/core.mk:88: recipe for target 'notify' failed
make[1]: *** [notify] Error 1
make[1]: Leaving directory '/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware'
Makefile:164: recipe for target 'install-ng' failed
make: *** [install-ng] Error 2
root@XPS13-CGruber:/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware#
1 Like

Analyse

Irgendwie mogelt sich hier noch der Ruf zu tools/terkin.py mit rein, das neu hinzugekommenen Desktop Notifications implementiert. Da tools/terkin.py nur unter Python3 funktioniert, kommt der entsprechende Fehler bei Dir, weil es scheinbar per Python2 ausgeführt wird.

Hm

Sorry! Wir werden nachbessern.

1 Like

Ahh, der schon wieder! ;-) Hatten wir den nicht schon mal rausgeworfen? Oder nur temporär.

Scheinbar nicht.

ifeq ($(OS),Windows_NT)
    $(eval RUNNING_IN_HELL := true)
endif

Das hier scheint noch nicht zu klappen. Vermutlich, weil es $OS nicht innerhalb der WSL gibt, so wie von @MKO neulich bei Running the MicroTerkin Agent on Windows - #37 by MKO berichtet.

Dein QuickFix™ Workaround: Im Makefile danach (ca. Zeile 44) folgendes einfügen:

RUNNING_IN_HELL := true

Hi Clemens,

vielleicht klappt es mit den jüngsten Änderungen zur Betriebssystemerkennung jetzt besser für Dich.

Viele Grüße,
Andreas.

1 Like

Ja, nun funktioniert es! Danke!

Problems

make recycle-ng

make[2]: Entering directory '/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware'
INFO: Checking for existance of the "lftp" program at "/mnt/c/ProgramData/chocolatey/bin/lftp.exe"
/mnt/c/ProgramData/chocolatey/bin/lftp.exe -u micro,python 192.168.178.25 < tools/upload-mpy.lftprc
mirror: Access failed: //wsl$/Ubuntu/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware/lib-mpy: No such file or directory

mpy-cross

root@XPS13-CGruber:/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware# make mpy-compile
./bin/mpy_cross_all.py: No such file or directory
tools/micropython.mk:88: recipe for target 'mpy-cross-setup' failed
make: *** [mpy-cross-setup] Error 1
root@XPS13-CGruber:/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware#

Error handling

./bin/mpy_cross_all.py: No such file or directory
tools/micropython.mk:88: recipe for target 'mpy-cross-setup' failed
make[2]: *** [mpy-cross-setup] Error 1
make[2]: Leaving directory '/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware'
make[2]: Entering directory '/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware'
\x1b[0m[INFO]   \x1b[0m Checking for existance of the "lftp" program at "/mnt/c/ProgramData/chocolatey/bin/lftp.exe"

ANSI colored output on WSL

\x1b[36;01m[ADVICE] \x1b[0m You might want to check the output of the file transfer process above for any errors.