MicroPython-Firmware schmirgeln (240er)

Ich bekomme bei make setup

You are using pip version 19.0.3, however version 19.1.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

und wollte daraufhin schon mit pip install --upgrade pipupdaten,

da kommt aber

root@XPS13-CGruber:/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware# pip install --upgrade pip
/usr/local/lib/python2.7/dist-packages/pip/_vendor/requests/__init__.py:83: RequestsDependencyWarning: Old version of cryptography ([1, 2, 3]) may cause slowdown.
  warnings.warn(warning, RequestsDependencyWarning)
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.
Requirement already up-to-date: pip in /usr/local/lib/python2.7/dist-packages (19.1.1)

Wir hatten das aber nativ unter Win und nicht im WSL!

Ist nicht schlimm.

Stimmt. Möglich. Stimmt. Möglich. Die Ursache ist aber vermutlich die gleiche.

root@XPS13-CGruber:/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware# python
Python 2.7.12 (default, Nov 12 2018, 14:36:49)
[GCC 5.4.0 20160609] on linux2

python3 ist auch drauf

root@XPS13-CGruber:/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware# python3
Python 3.5.2 (default, Nov 12 2018, 13:43:14)
[GCC 5.4.0 20160609] on linux

https://stackoverflow.com/questions/48524196/how-to-get-python-to-run-python-3-in-wsl-bash

To run python3 , you have to specify python3 on the CLI.

Das Python der Sandbox liegt unter .venv3/bin/python bzw. .venv3/bin/python3. Obwohl das Makefile Dir diese Arbeit eigentlich vollständig abnehmen sollte, kann Dir vielleicht eine “Aktivierung” des venvs per source .venv3/bin/activate weiterhelfen, bevor Du make recycle-ng aufrufst.

make recycle hat ja früher funktioniert, nun ist was anders mit recycle-ng??

Leider nicht, wenn ich das richtig gemacht habe

root@XPS13-CGruber:/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware# source .venv3/bin/activate
(.venv3) root@XPS13-CGruber:/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware# make recycle-ng
Device port: ip => 192.168.178.24
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
Makefile:174: recipe for target 'install-ng' failed
make: *** [install-ng] Error 1

Vielen Dank nochmals. make recycle sollte auf jeden Fall vorerst niemals terkin.py bemühen müssen. Das kam versehentlich wegen der Desktop Notifications rein und wurde gerade eben per Makefile: Suppress desktop notifications on Windows for now · hiveeyes/hiveeyes-micropython-firmware@f22c3ba · GitHub wieder behoben.

Happy recycling again!


P.S.: Leider klappte bei @clemens der FTP-Transfer auf diese Weise jedoch noch nicht out-of-the-box, da das unter Ubuntu/WSL installierte lftp in einer Version 4.6.3.0 vorlag, die mit den aktuellen Einstellungen aus upload-all.lftprc scheinbar nicht ordentlich gegen das Pycom Gerät arbeiten kann und blöde Fehler wirft, die wir nicht beheben konnten. Schade!

Wir haben uns dann damit beholfen, lftp über Chocolatey nativ unter Windows zu installieren.

choco install lftp

Mit der dadurch vorliegenden Version 4.8.0 klappt dann der Transfer, allerdings noch nicht automatisiert über das Make-Target "make install-ftp", sondern leider nur zu Fuß nach ein paar kleineren Anpassungen.

Fazit: Klappt in der Theorie und Praxis, allerdings leider nicht so wie geplant. Daher nun der Seitenblick hin zu Entwicklungsversion der Datenlogger-Firmware direkt in Atom/Pymakr nutzen.

Warum kann ich über die Serielle Schnittstelle nun nicht mehr updaten?

root@XPS13-CGruber:/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware# export MCU_PORT=/dev/ttyS16
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

Nachdem minutenlan nichts passierte habe ich mit

^X^C abgebrochen

Traceback (most recent call last):
  File "/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware/.venv3/lib/python3.5/site-packages/rshell/main.py", line 1255, in connect
    ip_address = socket.gethostbyname(port)
socket.gaierror: [Errno -2] Name or service not known

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File ".venv3/bin/rshell", line 10, in <module>
    sys.exit(main())
  File "/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware/.venv3/lib/python3.5/site-packages/rshell/command_line.py", line 4, in main
    rshell.main.main()
  File "/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware/.venv3/lib/python3.5/site-packages/rshell/main.py", line 2843, in main
    real_main()
  File "/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware/.venv3/lib/python3.5/site-packages/rshell/main.py", line 2805, in real_main
    connect(args.port, baud=args.baud, wait=args.wait, user=args.user, password=args.password)
  File "/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware/.venv3/lib/python3.5/site-packages/rshell/main.py", line 1261, in connect
    connect_serial(port, baud=baud, wait=wait)
  File "/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware/.venv3/lib/python3.5/site-packages/rshell/main.py", line 1285, in connect_serial
    dev = DeviceSerial(port, baud, wait)
  File "/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware/.venv3/lib/python3.5/site-packages/rshell/main.py", line 1553, in __init__
    data = pyb.read_until(1, b'>>> ', timeout=0.1)
  File "/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware/.venv3/lib/python3.5/site-packages/rshell/pyboard.py", line 154, in read_until
    data = self.serial.read(min_num_bytes)
  File "/home/cgruber/hiveeyes/sources/hiveeyes-micropython-firmware/.venv3/lib/python3.5/site-packages/serial/serialposix.py", line 483, in read
    ready, _, _ = select.select([self.fd, self.pipe_abort_read_r], [], [], timeout.time_left())
KeyboardInterrupt
Makefile:191: recipe for target 'install-requirements' failed
make: *** [install-requirements] Error 1

Funkt da die IP-basierte Variante dazwischen? Ich kann so nicht testen, weil ich die aktuelle Firmware gerade nicht aufs Gerät bekommen.

Gleiches bei make recycle und make list-boards

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.